# -*-coding:utf-8-*-
# 12.1 构造和析构
class Rectangle:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def getPeri(self):
        return (self.x + self.y) * 2

    def getArea(self):
        return self.x * self.y


rect = Rectangle(3, 4)


# print(rect.getPeri())
# print(rect.getArea())
# 注：一般在需要进行初始化的时候才重写__init__方法

# 12.1.2 __new__(cls[,...])
#  __new__（）才是一个对象实例化的时候所调用的第一个方法。它跟其他魔法方法不同，它的第一个参数不是self而是这个类（cls），
# 而其他的参数会直接传递给__init__（）方法

# __new__()方法需要返回一个实例对象，通常是cls这个类实例化的对象，当然也可以返回其他对象

# __new__() 方法平时很少去重写它，一般让Python用默认的方案执行就可以了。但是有一种情况需要重写这个魔法方法，就是当继承一个
# 不可变的类型的时候，它的特性就显得尤为重要了
class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)


a = CapStr("I love FishC.com")


# print(a)

# 12.1.3 __del__(self)
# 当对象将要被销毁的时候，这个方法就会被调用。但一定要注意的是，并非del x 就相当与自动调用x.__del__，
# __del__ 方法是当垃圾回收机制机制回收这个对象的时候掉用的
class C:
    def __init__(self):
        print("我是__init__方法，我被调用了...")

    def __del__(self):
        print("我是__del__方法，我被调用了...")


# c1 = C()
# c2 = c1
# c3 = c2
# del c1
# del c2
# del c3

# 12.2 算术运算
# class C:
#     pass
#
#
# print (type(C))


class New_int(int):
    def __add__(self, other):
        return int.__sub__(self, other)

    def __sub__(self, other):
        return int.__add__(self, other)


a = New_int(3)
b = New_int(5)


# print(a + b)
# print(a - b)

class Try_int(int):
    def __add__(self, other):
        return int(self) + int(other)

    def __sub__(self, other):
        return int(self) - int(other)


a = Try_int(3)
b = Try_int(5)


# print(a + b)
# print(a - b)

# 12.2.2 反运算
class Nint(int):
    def __radd__(self, other):
        return int.__sub__(other, self)


a = Nint(5)
b = Nint(3)


# print(a + b)
# print(1 + b)

# 12.3 简单定制
class A:
    def __str__(self):
        return "小甲鱼是帅哥！"


a = A()


# print(a)


class B:
    def __repr__(self):
        return "小甲鱼是帅哥!"


b = B()
# print(b)
import time as t


class MyTimer:
    # 开始计时
    def start(self):
        self.start = t.localtime()
        print("计时开始...")

    # 停止计时
    def stop(self):
        self.stop = t.localtime()
        self._calc()
        print("计时结束！")

    # 内部方法，计算运行时间
    def _calc(self):
        self.lasted = []
        self.prompt = "总共运行了"
        for index in range(6):
            self.lasted.append(self.stop[index] - self.start[index])
            self.prompt += str(self.lasted[index])
        print(self.prompt)


# t1 = MyTimer()
# t1.start()
# t1.stop()


#  完成“print（t1）和直接调用t1均显示结果”，就要通过重写__str__（）和__repr__（）魔法方法实现：
def __str__(self):
    return self.prompt
__repr__ = __str__


# t1 = MyTimer()
# t1.start()
# t1.stop()
# t1
